package model

import (
	"context"
	"gorm.io/gorm"
)

type (
	Api interface {
		// 新增单条记录
		InsertOne(ctx context.Context, api string) error
		FindOne(ctx context.Context, api string) (*AuthxApi, error)
		DeleteOne(ctx context.Context, api string) error
		All(ctx context.Context) ([]*AuthxApi, error)
		// data中的key为api，value为AuthxApi
		AllToMap(ctx context.Context) (data map[string]*AuthxApi, err error)
	}

	defaultApi struct {
		db *gorm.DB
	}
)

// ... 现有导入和接口定义保持不变 ...

func NewApi(db *gorm.DB) Api {
	return &defaultApi{
		db: db,
	}
}

func (d *defaultApi) model() *gorm.DB {
	return d.db.Model(&AuthxApi{})
}

func (d *defaultApi) InsertOne(ctx context.Context, api string) error {
	return d.db.Create(&AuthxApi{Api: api}).Error
}

func (d *defaultApi) FindOne(ctx context.Context, api string) (*AuthxApi, error) {
	var result AuthxApi
	err := d.model().Where("api = ?", api).First(&result).Error

	switch err {
	case nil:
		return &result, nil
	case gorm.ErrRecordNotFound:
		return nil, ErrNotFound
	default:
		return nil, err
	}
}

func (d *defaultApi) DeleteOne(ctx context.Context, api string) error {
	return d.model().Where("api = ?", api).Delete(&AuthxApi{}).Error
}

func (d *defaultApi) All(ctx context.Context) ([]*AuthxApi, error) {
	var apis []*AuthxApi
	if err := d.model().Find(&apis).Error; err != nil {
		return nil, err
	}
	return apis, nil
}

func (d *defaultApi) AllToMap(ctx context.Context) (map[string]*AuthxApi, error) {
	apis, err := d.All(ctx)
	if err != nil {
		return nil, err
	}

	data := make(map[string]*AuthxApi)
	for _, a := range apis {
		data[a.Api] = a
	}
	return data, nil
}
